//package com.dora.http.requestbuilder;
//
//import com.dora.http.base.headerfilter.DefHeadersOkInterceptor;
//import com.dora.http.base.headerfilter.RequestResOkLogInterceptor;
//import com.dora.http.exception.DoraException;
//import com.google.gson.Gson;
//import lombok.extern.slf4j.Slf4j;
//import okhttp3.*;
//import java.lang.reflect.Type;
//import org.springframework.util.CollectionUtils;
//
//import java.io.IOException;
//import java.util.Base64;
//import java.util.Map;
//import java.util.Objects;
//import java.util.concurrent.TimeUnit;
//
//
///**
// * @Author: Dora
// * @Description: OkHttp3 核心-处理构建类
// * @Date: 2021/12/22
// */
//@Slf4j
//public class RequestOkBuilder {
//    private volatile static RequestOkBuilder builder = null;
//
//    /**
//     * 最大连接时间
//     */
//    public final static int CONNECTION_TIMEOUT = 5;
//    /**
//     * JSON格式
//     */
//    public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
//    /**
//     * OkHTTP线程池最大空闲线程数
//     */
//    public final static int MAX_IDLE_CONNECTIONS = 100;
//    /**
//     * OkHTTP线程池空闲线程存活时间
//     */
//    public final static long KEEP_ALIVE_DURATION = 30L;
//    /**
//     * GSON格式
//     */
//    public static final Gson GSON = new Gson();
//
//    public static String BASE64_PREFIX = "data:image/png;base64,";
//
//
//    public static RequestOkBuilder create() {
//        if (builder == null) {
//            synchronized (RequestOkBuilder.class) {
//                if (builder == null) {
//                    builder = new RequestOkBuilder();
//                }
//            }
//        }
//        return builder;
//    }
//
//    private RequestOkBuilder() {}
//
//    /**
//     * client
//     * 配置重试|日志拦截|Headers
//     */
//    public static OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder()
//            .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
//            .connectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION, TimeUnit.MINUTES))
//            // 新增 日志拦截器或者请求头
////            .addInterceptor(new DefHeadersOkInterceptor())
//            .addInterceptor(new RequestResOkLogInterceptor())
//            .build();
//
//    /**
//     * 设置请求头
//     * @param builder 请求实例
//     * @param headers 请求头
//     */
//    private static void setHeaders(Request.Builder builder,Map<String, String> headers) {
//        if (Objects.nonNull(headers) && headers.size() > 0) {
//            headers.forEach((k, v) -> {
//                if (Objects.nonNull(k) && Objects.nonNull(v)) {
//                    builder.header(k, v);
//                }
//            });
//        }
//    }
//
//
//    /**
//     * get请求，无需转换对象
//     *
//     * @param url     链接
//     * @param headers 请求头
//     * @return 响应信息
//     */
//    public static Response get(String url, Map<String, String> headers) {
//        try {
//            Request.Builder builder = new Request.Builder();
//            setHeaders(builder, headers);
//            Request request = builder.url(url).build();
//            Response response = HTTP_CLIENT.newCall(request).execute();
//
//            if (response.isSuccessful() && Objects.nonNull(response.body())) {
//                return response;
//            }
//        } catch (Exception e) {
//            new DoraException("执行get请求，url: {} 失败!\n",url,e);
//        }
//        return null;
//    }
//
//
//    /**
//     * @Description post 表单构建
//     * @Data 2022/1/4
//     * @Param [url, headers, parameters]
//     **/
//    public static Response post(String url, Map<String, String> headers, Map<String, String> parameters) throws IOException {
//        Request.Builder builder = new Request.Builder();
//        FormBody.Builder formParams = new FormBody.Builder();
//        if (!CollectionUtils.isEmpty(parameters)) {
//            parameters.forEach(formParams::add);
//        }
//        FormBody body = formParams.build();
//        setHeaders(builder,headers);
//        Request request = builder.url(url).post(body).build();
//        Response response = HTTP_CLIENT.newCall(request).execute();
//        if (response.isSuccessful() && Objects.nonNull(response.body())) {
//            return response;
//        }
//        return null;
//    }
//
//    /**
//     * @Description post json构建
//     * @Data 2022/1/4
//     * @Param [url, headers, json]
//     **/
//    public static Response post(String url, Map<String, String> headers, String json) throws IOException {
//        RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, json);
//        Request.Builder builder = new Request.Builder();
//        setHeaders(builder, headers);
//        Request request = builder.url(url).post(body).build();
//        Response response = HTTP_CLIENT.newCall(request).execute();
//        if (response.isSuccessful() && Objects.nonNull(response.body())) {
//            Response result = response;
//            return result;
//        }
//        return null;
//    }
//
//    /**
//     * 支持嵌套泛型的post请求。
//     * <pre>
//     *   Type type = new TypeToken<Results<User>>() {}.getType();
//     * <pre/>
//     *
//     * @param url     链接
//     * @param headers 请求头
//     * @param json    请求json
//     * @param type    嵌套泛型
//     * @return 响应对象, 可进行强转。
//     */
//    public static <T> T post(String url, Map<String, String> headers, String json, Type type) throws IOException {
//        Response result = post(url, headers, json);
//        if (Objects.nonNull(result) && Objects.nonNull(type)) {
//            return GSON.fromJson(result.toString(), type);
//        }
//        return null;
//    }
//
//    /**
//     * 读取流，转换为Base64
//     * 返回base64的照片
//     */
//    public static String postImg(String url, Map<String, String> headers, String json) {
//        RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, json);
//        Request.Builder builder = new Request.Builder();
//        setHeaders(builder, headers);
//        Request request = builder.url(url).post(body).build();
//        try {
//            Response response = HTTP_CLIENT.newCall(request).execute();
//            String contentType = null;
//            if (response.body() != null && response.body().contentType() != null) {
//                contentType = response.body().contentType().toString();
//            }
//            if ("image/png".equals(contentType)) {
//                //读取流
//                return BASE64_PREFIX + new String(Base64.getEncoder().encode(response.body().bytes()));
//            }
//        } catch (IOException e) {
//            new DoraException("执行postImg请求，url: {} 失败!\n",url,e);
//        }
//        return null;
//    }
//
//
//
//
//
//    public static void main(String[] args) throws Exception {
//        RequestOkBuilder builder = RequestOkBuilder.create();
//        Map<String, String> parameters = new DefHeadersOkInterceptor().defHeaders();
//        parameters.put("Content-Type", "application/json;charset=utf-8");
//        Response response = builder.post("ws://172.18.130.53:7004/lthrift",parameters,parameters);
//        System.out.println("响应："+response.toString());
////        Request.Builder reqbuilder = new Request.Builder();
////        builder.setHeaders(reqbuilder,defHeadersFilter);
////        Request request = reqbuilder.get().url("ws://172.18.130.56:7004/lthrift").build();
////        Response response = HTTP_CLIENT.newCall(request).execute();
//////        RequestOkHttpBuilder builder = RequestOkHttpBuilder.create().setHeader(defHeadersFilter).setBaseUrl("http://172.18.130.52:45679/api/v2/grayscale/getdefaultconfig");
////        HTTP_CLIENT.newWebSocket(request, new OkHttpWsListener());
////        System.out.println(response.toString());
//
//    }
//}
